Developer Handover · Updated June 2026

Make weight.
Keep your power.

OnWeight is an iOS app that maps a combat athlete's weight cut from camp start to the official weigh-in — keeping the cut safe (gradual, power-preserving) and reading the scale honestly (a smoothed trend with cycle-aware adjustments, never the raw daily number). This document is the complete brief for building it: every screen, the logic behind them, the design system, the scope split, and where each area stands.

iOS · SwiftUIRecommended target
~75 screensAcross 14 flows
Hi-fidelityFinal colour, type, copy
7 sportsMen & women divisions
01

What you're building

The product in one read

A fighter weighs in every morning. The numbers are noisy — water, food, glycogen — and judging a cut on a single reading is both wrong and stressful. OnWeight's whole job is to interpret those weigh-ins: smooth them into a true trend, project that trend to weigh-in day, and tell the athlete in plain, corner-coach language whether they'll make weight safely and on time.

The intelligence is three layers, and everything else hangs off them:

Layer 1

Trend

Smooth noisy daily weigh-ins into a true trajectory (an EWMA). The trend — not the raw scale — is what the athlete sees as a verdict.

Layer 2

Projection

Extrapolate the trend to weigh-in day, adjusted for the cycle-water the scale will read that morning. Drawn as a widening cone, not a false single line.

Layer 3

Verdict

Classify pace — safe / too fast / behind / off-track — and coach accordingly. Red is reserved for genuine risk.

The app is paywalled end-to-end — no free tier. First-run is one funnel with a single hinge, the paywall: before it, the job is to convert (prove value, earn the subscription); after it, to activate (get the first weigh-in logged fast). The product then lives in a daily loop, escalates into a fight-week lifecycle, and falls back to a no-deadline maintenance mode between camps.

This is a health product for a RED-S-sensitive population. Weight-category athletes carry elevated risk of low energy availability. The design never suggests a faster cut, never shames a stall, treats a lost period as a wellness signal (not a convenience for the model), and caps everything against a 1%-of-bodyweight-per-week safety ceiling. Honour that posture in every build decision — it is the spine of the product, not a disclaimer.


02

How to use this handover

Read first

The bundled files are design references, not production code. They are prototypes built in HTML + React-in-the-browser (Babel) that show the intended look, copy and behaviour exactly. Your task is to recreate these designs natively using the target codebase's patterns — not to port the React or ship the HTML. Re-implement idiomatically; treat the prototype as a faithful spec of layout, tokens, copy and flow.

The two files that are the source of truth

Pixel inventory

OnWeight - All Screens.html

Every screen and state on one pan/zoom canvas, grouped by flow. Click any artboard to focus it. This is the complete visual spec — open it to see exact pixels for anything below.

Interaction spec

OnWeight - Prototype.html

The wired, clickable build: real navigation, branching, live keypad and verdict logic. Open it and tap through; the jump menu lists every wired screen id.

How the prototype encodes navigation

The prototype is a screen registry plus a tap-delegation layer — the clearest spec of intended navigation. Two structures matter:

  • SCREENS — every screen, its type (flow = Next advances · tabbed = live tab bar · plain = back only) and its next/back targets.
  • WIRE — per-screen rules [regex on the tapped element's text → destination]. Read this as the navigation table: it documents exactly where each control leads.

Demo toggles in the prototype chrome — pace (on / behind / off), sport and sex — drive the verdicts, branching and the cycle model so you can reach every fork.

Supporting references in this bundle

  • Logic & Flows — the engine source-of-truth: every formula, the tracking cascade, camp states, per-sport rules. The single most important doc for the math.
  • Spec · Component Specs · Foundations · Copy Rules — navigation/inventory, the shared component kit, design tokens, and the corner-coach voice + locked lexicon.
  • Weight-Tracking Methodology · Chart Explorer · Rules Verification — the science for sign-off, every chart in the app, and each sport figure beside its governing-body source.
  • Accessibility Pass · BFM Audit · Prototype Gaps — the a11y review, the UX-psychology critique with fixes, and how the prototype is wired + what isn't linked yet.

The full file list is in §20. A live screen browser is in §04.


03

Target & fidelity

Native iOS · SwiftUI

The design is iOS-native in spirit. SwiftUI is the recommended target. Recreate the UI pixel-faithfully using native components rather than reproducing the prototype's bespoke chrome:

Map to native

  • List / Form for grouped settings & rows
  • NavigationStack for push drill-downs + edge-swipe back
  • .sheet with detents for scoped tasks (log weight, pickers, confirms, info sheets)
  • action sheet / alert with a destructive role for cancel/delete
  • Picker, Toggle, segmented controls for inputs

Fidelity is high

Colours, typography, spacing, copy and interactions are final. The two HTML artifacts are the pixel truth. Where this doc and a screen disagree, the screen wins — then flag it to design. Don't invent new colours or spacing; everything you need is in §11.

If a cross-platform stack is chosen instead (React Native, Flutter), the same fidelity bar applies — use that stack's idiomatic navigation, sheets and form controls. The prototype's React is a spec, never a dependency.


04

Screens by flow

~75 screens · 14 flows

The product breaks into the flows below. Screen ids match the prototype jump menu and the live browser further down. Open All Screens for pixel detail on any of them.

The flows

Flow 1 · pre-paywall

Onboarding (convert)

splash → launch → sport → fight date (or no-fight) → biological sex → current weight → limit → cut rate → "building your camp" → Coach's Read → Plan Preview / paywall. The limit step gates to an out-of-range screen on an unsafe target. The Coach's Read shows the cycle card only for female athletes. Six high-signal questions; account & permissions deferred.

Flow 2 · post-paywall

Set up camp (activate)

paywall → create account (Apple/Google + email, safety disclaimer, age gate) → dashboard empty state → log first weigh-in (the activation milestone). Precision setup is an opt-in "Sharpen your plan" card: weigh-in time → reminder → [female] cycle sub-flow → competition rules → cut strategies → check details → plan shape.

Core

Daily loop

Today dashboard (hero trend numeral, pace verdict, the one red Add today's weight CTA, tracking card) → Log Weight (keypad) → Result (verdict from the typed number) → Trend (chart, recent log, weekly check-ins).

State machine

Camp lifecycle

fight week → weigh-in day (keypad → Made/Missed by the number) → made/missed → rebuild → fight day → result → recovery; plus maintenance (no camp) and paused, with a Transition Confirm in/out.

Plan

Plan & refine

Your Camp; Edit Plan — every field editable (division, weigh-in date, cut rate, gear allowance, rehydration cap), each opening an editor with a live "How this changes your plan" before→after panel; Sharpen accuracy inputs; Change Plan.

Female

Cycle intelligence

Menstrual Cycle (mode segmented, phase indicator, forecast, learned-from-your-data, setup rows), Cycle Check-in ("doesn't match how I feel" → phase-signs help + re-anchor). See §08.

Account

Settings, auth & safety

single sport-avatar entry (top-right) → Account & units → Notifications, Units, Subscription (→ payment, billing), Privacy & data (→ export, legal); field editors; create account / verify / safety disclaimer / age gate (18+ only — under-18 not eligible).

Resilience

Errors, empty, system

offline, save-fail, declined-purchase, permission-denied, first-run empty states; subscription lifecycle (trial, grace, lapse, restore); notifications & sync; legal; imperial parity; localization (8 locales + RTL); widgets.

Key screens at a glance

A curated set — the heroes of each flow. The complete set is in the live browser below and in All Screens.

Live screen browser

Every screen, rendered live from the same components as All Screens. Pick one to load it in the device; scroll inside the device for the full screen.

Loading…

Screens in the Future · sandbox group are reference-only and out of scope for R1 — see §16. They appear in this browser as a catalogue; they are never wired from a live screen.


05

Interactions & behaviour

Navigation & gestures

  • Push for drill-downs, with one labelled back control and edge-swipe on every pushed screen.
  • Detented bottom sheets (grabber + swipe-to-dismiss) for scoped tasks: confirms, pickers, log weight, info sheets.
  • Alert / action sheet for destructive confirms, with a real red destructive role — never a fake "hold to confirm".
  • Live tab bar (5 items) on the core tabbed screens: Today · Plan · Trend · Learn · More.

Controls are live and must reflect downstream

Toggles flip, segmented controls and radios move, multi-selects toggle. Critically: anywhere copy says targets or the trend "adjust on the spot", the change must re-run the projection and reflect everywhere. The plan editors already preview a before→after; the build must persist and recompute.

Verdict, transitions, motion

  • Verdict logic: trend = EWMA of daily weigh-ins; pace verdict from the 7-day rolling rate + cycle-adjusted projection; drift-watch (CUSUM) is the early, non-red tier. Formulas in §07.
  • Transitions: ~0.26s screen swap; respect prefers-reduced-motion. Entrance animations gate on the active state + reduced-motion so print/PDF/reduced-motion show content, never a pre-animation blank.
  • Loading as labour: "Building your camp" animates the projection forming — keep it; it's the engineered beat before the paywall.

06

State & data model

Per-user profile (set in onboarding, editable in Plan/Settings)

FieldNotes
sportOne of 7. Drives rules, gear, coach voice, division ladder.
biologicalSexSelects the division ladder (divisions.men/women) and gates the cycle flow.
hasFight + fightDateNo-fight users get an open-ended plan (maintenance, §10).
currentWeight (kg)Starting / walk-around weight.
goalWeight (kg)Fight-day scale target. User-facing word is "your limit" — the field name stays goalWeight; only the copy changed (see lexicon, §19).
cutRate (%bw/wk)0.25 / 0.5 (recommended) / 0.75 / 1.0 (ceiling).
cutStrategies[]Fight-week tactics (low fibre, low sodium, sweat-out…).
competition rulesPer-sport, auto-filled, user-confirmable: equipment weight, re-weigh %, weigh-in timing, hydration clause.
cycle settingsmode + length + last-period (female + opted-in only).
unitskg / lb. kg is canonical; convert at the edge (§11).
subscription statetrial / active / grace / lapsed.

Daily & derived

  • entries[]: { date, time, weight, note? } — one canonical fasted morning weigh-in per day; later same-day readings kept as context, never fed to the trend.
  • Derived: trend (EWMA), 7-day velocity, projection cone, pace verdict, cycle offset/buffer, drift-watch CUSUM.

Camp state machine

// athlete-confirmed transitions — never silent
no-camp  ⇄  camp ( active → fightWeek → weighIn → made|missed
                   → rebuild → fightDay → result → recovery )  ⇄  paused

Editors are front-end-only in the prototype. In the build, persist every editor/picker selection, recompute the projection, and round-trip to the user record.


07

The engine

Trend · projection · verdict

Full derivations and the evidence behind every default live in OnWeight - Logic & Flows. The essentials:

Trend (EWMA) & velocity

// 5-day exponentially-weighted moving average (the bold line; raw = faint dots)
trend[i] = Σ ( weight[i-k] · 0.75^k ) / Σ ( 0.75^k )   for k = 0..4
weeklyVelocity = 7-day change in the trend            // kg/week, negative = losing

Target weight (equipment changes the body target)

scaleTarget = divisionLimit                  // the official class limit
bodyTarget  = scaleTarget − equipmentWeight  // gear sports subtract gi/gear; underwear-only ≈ scaleTarget

Projection & the cycle-aware buffer

projected      = trendingToday + dailyVelocity × daysToWeighIn   // true-weight
weighInOffset  = cycleOffsetKg(weighInDay)     // kg the scale reads above true wt that day
projectedScale = projected + weighInOffset     // honest scale reading at weigh-in
cycleBuffer    = max(0, weighInOffset)         // extra TRUE weight to pre-cut
trueTarget     = bodyTarget − cycleBuffer
scaleGap       = projectedScale − bodyTarget   // the gap that decides made/missed

The Trend tab draws a projection cone — a widening fan whose upper edge carries the cycle-water risk — instead of an over-confident single line. Verdict: the cone clears / straddles / misses the limit.

Cut-rate thresholds (% bodyweight per week)

OptionRateGuidance
Maximum1.0%/wkHard safety ceiling — beyond this, muscle/strength loss is likely.
Aggressive0.75%/wkEffective but may impact performance during camp.
Recommended0.5%/wkOptimal — preserves muscle, supports performance.
Conservative0.25%/wkSlow & steady; needs a longer timeline.

The verdict cascade (never judge a raw daily number)

  1. Step 0 — Displayed trend: the only weight shown as a verdict is the 7-day-equivalent EWMA. Raw daily is logged and charted as dots, carries no verdict.
  2. Step 1 — Daily silent gate: within ±200g of the cycle-adjusted expected weight → silently fine. Off it → escalate silently (no red).
  3. Step 2 — 3-day provisional filter: 3-day average within ±0.4kg (≈0.5%, matched to its real noise) → treat as noise.
  4. Step 3 — 7-day rate verdict: last-7-day vs prior-7-day true-weight rate (cycle-water removed) drives on-track / cutting-fast / behind. Needs ≥4 logs/window; <14 days → all-data regression.

Two-tier detection

TierMethodSurfaced asFires re-plan?
TrendEWMAthe weight shownno
Drift-watchCUSUM of deviation vs cycle linequiet, non-red noteno (soft only)
Confirmed verdict7-day rolling rate + projectionverdict + Change-planyes

Two independent re-plan triggers, both with hysteresis + a 2-reading confirm so the athlete is never bounced in and out of "off track": (A) projection miss — projected scale weight misses the limit across 2 readings; (B) safety ceiling — measured rate > 1%/wk regardless of whether weight will still be made.

A handful of threshold numbers (exact gauge boundaries) are evidence-based defaults flagged for sports-dietitian sign-off in Logic & Flows §6/§14. Implement them as configurable constants, not magic numbers.


08

Cycle intelligence

Sex-gated · health-critical

Shown only when biologicalSex = female and the athlete opts in. The effect is small, fluid-only, and absent in many women — so the product leads with annotation over arithmetic.

The water-weight curve (one source of truth for every cycle chart + the projection)

cycleOffsetKg(day) = retention × −cos( 2π · (cycleDay − 10) / cycleLength )
// dips to −retention mid-follicular (~day 10), peaks +retention late luteal (~day 24)
// default amplitude retention = 0.5 kg · user-adjustable 0–2.5 · contraception/absent = 0

Three cycle modes

Natural cycle

Full phase model: water offset, undulating plan line, weigh-in buffer. Refined per-athlete from logged data.

Hormonal contraception

No natural-phase model (HC suppresses the fluctuation). Default flat 0 offset; rely on logged symptoms.

Absent / irregular

No phase model. If "absent" is unexpected → the RED-S safeguard fires.

RED-S safeguard (non-negotiable). A lost period is a primary warning sign of low energy availability, not a convenience for the model. Detection: secondary amenorrhea = 3+ missed expected cycles; oligomenorrhea = cycle > 45 days. When detected: never treat as "0 offset, carry on" — surface a calm, non-diagnostic note, recommend a doctor check-in, and bias toward the conservative end (never suggest a faster cut). Wellness signal, never a diagnosis.

Learning (future-tier headline): once ~2–3 confirmed cycles are logged, fit each athlete's real luteal amplitude from the cyclic residual (detrend the cut first) and recommend an update — never silent, always overridable, labelled an estimate not medical advice.


09

Sport rules & divisions

7 sports · verified

The experience is bespoke per sport: weigh-in timing, equipment, re-weigh rule and the cut style all differ. Full sourced tables (men + women, every division) are in Logic & Flows §17 and cross-checked in Rules Verification. The shape:

SportWeigh-inEquipmentRe-weigh / hydrationPlan type
BoxingAmateur same-day · pro day-beforenoneamateur walk-it-down · pro camp
MMADay before (a.m.)nonesome orgs test hydrationcamp (water cut viable)
Muay ThaiVaries — no universal standardnonevaries; ONE ≤5% regainfree-entry; same-day → walk-it-down
BJJ (IBJJF)Same-day, in the gi, before you competegi (weighed dressed)single weigh-in, no toleranceminimal water cut
Taekwondo (WT)Day before + random controldobok≤ +5% of category limitcamp
Judo (IJF)Day before + random controljudogi≤ +5% of category limitcamp
Wrestling (UWW)Same-day, morning, in singletnoneno tolerancewalk-it-down

Weigh-in timing sets the max safe fight-week water cut: same-day → ~0% (water cutting disabled, "walk-it-down"); within ~2h (BJJ) → minimal; day-before → up to ~5% of body mass, bounded by the re-weigh cap. Ship a per-sport division table; the athlete picks a division (autofills the scale target) — the typed limit is the fallback. The published division limit is the scale limit; gear sports subtract equipmentWeight to get the body target.


10

Maintenance / no-deadline mode

With no fight date, the countdown engine has nothing to anchor to. Maintenance mode replaces it with two date-free signals:

Band adherence

Where today's trend sits in a maintenance band. The target is self-set but the app recommends a band (~8–15% over the class) and explains why, so the next cut isn't a crash. States: in band · drifting high · near the re-entry ceiling.

Readiness

readinessWeeks = max(0, (currentTrend − bodyTarget) / (currentTrend × 1%)) — "from today, a safe cut to your class takes ~X weeks." The no-deadline analogue of the projection.

Anti-cycling is handled with gentle, educational nudges — never hard gates. Camp↔maintenance transitions are athlete-confirmed (prompted, flips only on confirmation) and carry over the walk-around baseline, division and learned-cycle data. Maintenance offers a "drop to weekly" weigh-in cadence.


11

Design tokens

Balanced theme · the shipping direction

Defined in fc-shared.jsx (THEMES.balanced). Full set + the cycle palette + WCAG figures are in Foundations. Every weight formats through a units engine (OWUnits) — never hard-code a unit string.

Colour

Typography

RoleFamilyUsage
DisplayOswald 500–700Eyebrows, buttons, scoreboard. Uppercase, letter-spacing 0.12–0.22em.
Body / titlesIBM Plex SansLarge title 27/700; body 14.5–16 / 400–600.
Hero numeralsIBM Plex Sans 300Hero weights 64–112px, letter-spacing −0.03em.
Labels / metadataIBM Plex Mono9.5–11px, uppercase, 0.06–0.16em.
QuotesIBM Plex Serif italicFighter quotes on the proof band.

Shape, depth & metrics

Shape

  • --radius 20px (cards) · --radius-ctl 14px (controls/buttons)
  • Card shadow 0 1px 3px rgba(20,18,12,.04), 0 8px 22px rgba(20,18,12,.05)
  • No card border on Balanced

Metrics

  • Min hit target ≥ 44pt
  • Tab bar: 5 items
  • Device frame 393×812 (iPhone)

12

Components

Shared kit · fc-shared.jsx

Full states and anatomy are in Component Specs. The shared kit:

Chrome

Phone · StatusBar · HomeIndicator · LargeTitle · CompactNav · TabBar · GearButton (the sport-avatar settings door).

Surfaces

Card · SectionHeader · GroupedList + Row (chevron only when navigable) · DashBanner · StepList.

Atoms

Stat · ToneBadge · Toggle · HeroButton (the single red "Add today's weight" CTA) · CoachTip · AvatarRow · ProofBand.

Charts

Trend line + scrubber, target-zone corridor, projection cone, cut burndown, drift-watch, noise-vs-trend, cycle-adjusted plan — all theme/tone-aware (fc-chart.jsx, fc-instruments.jsx).

Engine

fc-engine.jsx — divisions (men + women), pace classifier, cycle model, social-proof data, per-sport rules.

Units

OWUnits (fc-units.jsx) — kg↔lb conversion + formatting. kg is the source of truth; division tables stay canonical in their governing-body unit and convert for display.


13

Accessibility

Target WCAG 2.2 AA

From the Accessibility Pass on the Balanced theme. The palette is genuinely accessible — the warm paper costs nothing on contrast.

Contrast — computed

Passes AA across the board

Primary ink #15140f on white = 18.4:1. Every meaning-carrying colour clears AA, most by a wide margin. One finding: rule-2 #8a7f68 is 3.95:1 — fine for chevrons/toggle tracks (non-text UI, AA needs 3:1) but never as text. The form-field placeholder was moved to ink-3 (8.4:1) — keep it there.

Dynamic Type · VoiceOver

Dev-implementation notes

  • Support Dynamic Type — the hero numerals especially must scale.
  • Decorative SVGs (chevrons, dots, drag handles, glyphs) need aria-hidden / no accessibility element.
  • Pair every icon-only action with a label; use real buttons.
  • Honour reduced-motion (entrance animations already gate on it).
  • ≥ 44pt hit targets everywhere.

14

BFM design audit

UX-psychology critique + fixes

A Built for Mars-style critique scored each flow against 8 psychology principles. Most findings have been rolled into the prototype, designs and docs; what you implement should preserve the fixes and honour the two systemic notes. Full record in OnWeight - BFM Audit.

What's strong (protect it)

  • The verdict cascade — silent → silent → verdict, red only for real risk — is anxiety-reduction design at a rare level. Any reward/streak/social layer must never tip into comparison pressure or alarm.
  • Goal-first onboarding, plan assembled during onboarding, the Coach's Read aha before price.
  • Off-pace flow with hysteresis + two-read confirm and three safe outs (move division / move date / hold the safe rate).

Fixes applied

  • Done Social proof moved earlier + onto the hinge — a distinct full-bleed proof band on the Coach's Read and paywall, grounded in real cited per-sport research (no fake user counts).
  • Done 7-day free trial as the paywall's lifeboat, honestly framed ("we'll remind you 2 days before it ends").
  • Done Division picker on the limit screen (keypad as fallback).
  • Done First win before configuration — land on the dashboard empty state; precision setup is the opt-in "Sharpen" card.
  • Done Habit-reward consistency strip on the post-log result; cycle "typical" number aligned to the 0.5kg default.

Two systemic notes to carry into the build

Lever

Social proof is single-player

Every flow scores low on social proof in a sport that is intensely coach-and-gym social. The biggest untapped lever: an optional coach / peer visibility layer (kept in Future, §16).

Load-bearing

Re-engagement must be built

The hard paywall (no free fallback) and the long gaps between camps make the reminder / win-back / "fight booked?" path core, not polish. Designed in the Future sandbox; wire it to a real lapse/win-back lifecycle.

Still open (business/content, not design): final trial length + price; annual-only vs annual+monthly; replacing labelled placeholders (proof fighters/quotes, win-back & widget pricing) with verified content.


15

Scope — Release 1 vs Future

Full feature inventory

Every feature, categorised, split first-release versus future. needs a call marks an open product decision (see §18). Filter to scan.

0Release 1
0Future

16

Future-state

Out of scope for R1

The launch-point rule (non-negotiable). Future-state screens live in the roadmap sandbox and are reachable only as a catalogue. A current/shipping screen must never wire a launch point into a not-yet-built future destination. Do not add nav into these from onboarding, settings, plan, or the dashboard.

These are designed as concepts (in fc-future.jsx) but are explicitly not in Release 1:

Coach AI

Conversational corner-coach. Needs scope, guardrails and a safety policy before design hardens.

Learn library

Articles + video on cut science, the cycle, recovery. Layout exists; needs written + medically-reviewed content.

Nutrition / fuel

Meal & hydration guidance. Parked unless prioritised.

Devices & sync

Smart-scale (Bluetooth) connect beyond Apple Health auto-import.

Win-back & reminder re-ask

The re-engagement recovery the hard paywall depends on — design exists in sandbox; wiring to a real lapse lifecycle is a build task (see §14).

Coach view

A coach's read-only roster of their fighters — the accountability / social layer. Athlete still owns the plan.

Also future-tier: weigh-in time-drift & week-vs-usual compare charts; cycle symptom logging, learned cycle model & forecast chart; all widgets.


17

Build backlog

The engineering scope a static prototype can't show
  1. Engine The cut-science engine — trend (EWMA), 7-day velocity, cycle offset/buffer, projection cone, pace tiers, drift-watch CUSUM, the verdict cascade and the two re-plan triggers (§07). Thresholds as configurable constants.
  2. Live calc Live recalculation — Plan / Edit Plan / Sharpen / cycle changes must re-run the projection and reflect downstream. The editors already preview before→after.
  3. Gestures Native gestures — edge-swipe back on pushed screens; swipe-to-dismiss + true detents on sheets.
  4. Triggers Real-state triggers — billing state → subscription lifecycle; pace/drift math → verdicts & drift-watch; connectivity/purchase events → error states. (The ±20kg goal gate already fires on an unsafe typed target.)
  5. OS Defer to the system — notification-permission and Health/Devices sync hand off to the OS Settings app, not duplicated in-app.
  6. Data Persistence & data — persist every editor/picker selection and round-trip to the user record; the archive that pre-fills the next camp.
  7. Units Units roll-through — wire OWUnits (kg↔lb) through every remaining screen; division tables canonical in source unit, convert at the edge, limits round down.
  8. Re-engage Re-engagement lifecycle — reminder / email / win-back / "fight booked?" (load-bearing per §14).

18

Launch readiness

Nothing signed off yet

The screen set is drafted across every journey. No area is "done" — everything is designed and awaiting review & approval. Treat sign-off as the minimum gate before build.

Designed — awaiting sign-off (11 areas)

Onboarding & entry · Core loop · Lifecycle states · Accounts & safety · Subscription lifecycle · Legal & data rights · Imperial (lb) parity · Per-sport copy parity · Notifications & sync · Widgets · Errors, empty & localization.

Open product decisions — needs a call

DecisionThe call
Pricing & trialConfirm price + trial length (figures in the prototype are placeholders; BFM suggests a longer trial converts better). Annual-only vs annual+monthly. Regional pricing.
Notification cadenceSign off triggers + per-week limits in the content set (re-engagement cap).
Units roll-throughEng task: wire the kg→lb engine through every remaining screen.
Gauge thresholdsSports-dietitian sign-off on the exact pace boundaries (defaults set; §07).

Content production

Learn library (needs written + medically-reviewed articles/video), Coach AI (needs scope + safety policy), Nutrition — all Future-tier (§16).


19

Design rules to honour

Non-negotiables
Launch points

Never wire current → future

Future-state (Coach AI, Fuel, Devices & sync, Library) stays in the sandbox until built. No live screen hands off to a not-yet-built destination.

Settings

One door

A single sport-avatar entry (top-right) → Account. Don't reintroduce competing gear/More/in-context settings entries.

CTA

One core action

The single red HeroButton ("Add today's weight"). Don't redraw it per screen.

Rows

Chevron = navigation

Only show a forward chevron on rows that actually push a screen.

Cycle

Sex-gated & supportive

Cycle content is sex-gated. RED-S / lost-period messaging is supportive and non-diagnostic — never a faster-cut suggestion.

Lexicon

"Limit", not "goal"

The athlete-facing word for the scale number is limit. Code/field names stay goalWeight / bodyTarget / scaleTarget; only display copy uses "limit". Follow Copy Rules §5.


20

File index

What's in this bundle

Open these first

  • OnWeight - Developer Handover.html — this document.
  • OnWeight - All Screens.html — full visual inventory (every screen).
  • OnWeight - Prototype.html — wired interaction spec (tap through).
  • fc-screen.html — single-screen renderer (?s=<id>); powers the live browser in §04.

Reference docs

  • Logic & Flows — engine source-of-truth (formulas, cascade, per-sport rules).
  • Spec · Component Specs · Foundations · Copy Rules — inventory, components, tokens, voice.
  • Weight-Tracking Methodology · Chart Explorer · Rules Verification — science, charts, sport-rule sources.
  • Feature List · Launch Readiness · Accessibility Pass · BFM Audit · Prototype Gaps — scope, status, a11y, UX critique, wiring notes.
  • Onboarding & Goal-Setting · Camp Lifecycle · Daily Loop & Off-Pace — flow maps.
  • Social Proof Research.md — sourcing for the proof band.

Component sources (spec reference — not for porting)

The .jsx files build the screens. Shared system is fc-shared.jsx; the engine is fc-engine.jsx; charts are fc-chart.jsx / fc-instruments.jsx; units are fc-units.jsx. The HTML files reference the JSX by filename and the JSX sits alongside them, so everything opens and runs as-is in a modern browser (in-browser Babel).

No external image assets. Every mark is inline SVG — the wordmark/app mark, the per-sport athlete logos (fc-logo-sports.jsx), sport pictograms (fc-icons.jsx) and UI icons (fc-ui-icons.jsx). Recreate these as a native icon set / asset catalog. Fonts: Oswald, IBM Plex Sans/Mono/Serif (+ Plex Sans Arabic/Hebrew/JP/KR for localization) — bundle equivalents.

OnWeight · Developer Handover
Weight-cut companion for combat athletes
Recreate the designs natively · updated June 2026
Pixel truth: All Screens + Prototype
Engine truth: Logic & Flows
OnWeight HQ